/* Includes */
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/times.h>
#include <unistd.h>
#include "uart.h"


#if 0
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));
#endif


/* Functions */

void initialise_monitor_handles()
{
}

int _getpid(void)
{
	return 1;
}

int _kill(int pid, int sig)
{
	errno = EINVAL;
	return -1;
}

void _exit (int status)
{
	while (1) {}		/* Make sure we hang here */
}

int _read (int file, char *ptr, int len)
{
	int DataIdx;

    (void) file;
	for (DataIdx = 0; DataIdx < len; DataIdx++)
		*ptr++ = (char) Uart_getc();

    return len;
}

int _write(int file, char *ptr, int len)
{
	int DataIdx;

    (void) file;
	for (DataIdx = 0; DataIdx < len; DataIdx++)
        Uart_putc(*ptr++);
	return len;
}

caddr_t _sbrk(int incement)
{
    extern char _user_heap_start[];
    extern char _user_stack_end[];

    static char * heap_end = NULL;
    char *prev_heap_end;
    char *tmp;

    if (!heap_end)
        heap_end = _user_heap_start;

    prev_heap_end = heap_end;
    tmp = heap_end + incement;
    if (tmp >= _user_stack_end)
    {
        errno = ENOMEM;
        return (caddr_t) -1;
    }
    else if (tmp <= _user_heap_start)
    {
        errno = ENOMEM;
        return (caddr_t) -1;
    }
    heap_end = tmp;
    return prev_heap_end;
}

int _close(int file)
{
	return -1;
}


int _fstat(int file, struct stat *st)
{
	st->st_mode = S_IFCHR;
	return 0;
}

int _isatty(int file)
{
	return 1;
}

int _lseek(int file, int ptr, int dir)
{
	return 0;
}

int _open(char *path, int flags, ...)
{
	/* Pretend like we always fail */
	return -1;
}

int _wait(int *status)
{
	errno = ECHILD;
	return -1;
}

int _unlink(char *name)
{
	errno = ENOENT;
	return -1;
}

int _times(struct tms *buf)
{
	return -1;
}
int _gettimeofday (struct timeval *tv, void *tz)
{
    tv->tv_usec = 0;
    tv->tv_sec = 0;
    return 0;
}

int _stat(char *file, struct stat *st)
{
	st->st_mode = S_IFCHR;
	return 0;
}

int _link(char *old, char *new)
{
	errno = EMLINK;
	return -1;
}

int _fork(void)
{
	errno = EAGAIN;
	return -1;
}

int _execve(char *name, char **argv, char **env)
{
	errno = ENOMEM;
	return -1;
}

